This is some in-development work, based on something you’ve previously seen.
Below you’ll see the following:
- A map shaded by % Canopy Cover by NYC Community District [“Can_P”, Based on 2010 data; Darker Green = More Canopy]. The basemap is 2016 NYC Imagery;
- A scatterplot showing the % of households that are rent burdened on the y-axis [Based on NYC Community Profiles], with % Canopy Cover on the x-axis; and
- A table of the data.
* Rent burdened is defined as >35% of income is spent on rent
You can zoom in on the map (underlied by imagery), and clicking on community districts will highlight them both in the map and the scatterplot, and keep them in the table while excluding other rows. (The community district # will also be displayed). To reset the selection, you can either re-click the individual polygons, or just double click in the scatterplot. You can also draw a box around points in the scatterplot, which will highlight them in the map, and keep them in the table. (Unfortunately at this point, the table is really just for viewing - you can order data by clicking on column names, but you can’t select data in the table and have it reflected in the scatterplot/map.)
This is really for exploratory visualizations, and there are naturally additional things that can be added for ease of use. Compared to a previous version, this lets you select polygons, and also view the data in the table. In the near future I’ll work to do this with other layers, for example looking at combined % area canopy+grass by community district, and some other socio-economic variables from the Community Profiles. I’ll also work to add functionality to toggle layers on/off, and change the variable names as displayed. [running tally of desired functionality is at the bottom of the page.]
Desired Functionality:
- Add back toggling of basemaps;
- Add other layers to map (e.g., total area of estimated permeable or tree canopy; other socio-ecomic/health variables);
- Change variable names in display (e.g., % of Households that are Rent Burdened);
- Add another variable or two and make it so you can toggle between them;
- Make it so you can select in the table and have that reflected in the map and scatterplot;
- Histograms that highlight
LS0tCnRpdGxlOiAiUGN0IENhbm9weSB2cy4gUGN0IG9mIEhvdXNlaG9sZHMgUmVudCBCdXJkZW5lZCIKb3V0cHV0OiBodG1sX25vdGVib29rCmRhdGU6IDExIEZlYiAyMDE4CmF1dGhvcjogTWlrZSBUcmVnbGlhCi0tLQoKVGhpcyBpcyBzb21lIGluLWRldmVsb3BtZW50IHdvcmssIGJhc2VkIG9uIHNvbWV0aGluZyB5b3UndmUgcHJldmlvdXNseSBzZWVuLgoKQmVsb3cgeW91J2xsIHNlZSB0aGUgZm9sbG93aW5nOgoKKiBBIG1hcCBzaGFkZWQgYnkgJSBDYW5vcHkgQ292ZXIgYnkgTllDIENvbW11bml0eSBEaXN0cmljdCBbIkNhbl9QIiwgQmFzZWQgb24gMjAxMCBkYXRhOyBEYXJrZXIgR3JlZW4gPSBNb3JlIENhbm9weV0uIFRoZSBiYXNlbWFwIGlzIDIwMTYgTllDIEltYWdlcnk7CiogQSBzY2F0dGVycGxvdCBzaG93aW5nIHRoZSAlIG9mIGhvdXNlaG9sZHMgdGhhdCBhcmUgcmVudCBidXJkZW5lZCBvbiAgdGhlIHktYXhpcyBbQmFzZWQgb24gW05ZQyBDb21tdW5pdHkgUHJvZmlsZXNdKGh0dHBzOi8vY29tbXVuaXR5cHJvZmlsZXMucGxhbm5pbmcubnljLmdvdi8pXSwgd2l0aCAlIENhbm9weSBDb3ZlciBvbiB0aGUgeC1heGlzOyBhbmQgCiogQSB0YWJsZSBvZiB0aGUgZGF0YS4KClwqICpSZW50IGJ1cmRlbmVkIGlzIGRlZmluZWQgYXMgPjM1JSBvZiBpbmNvbWUgaXMgc3BlbnQgb24gcmVudCoKCllvdSBjYW4gem9vbSBpbiBvbiB0aGUgbWFwICh1bmRlcmxpZWQgYnkgaW1hZ2VyeSksIGFuZCBjbGlja2luZyBvbiBjb21tdW5pdHkgZGlzdHJpY3RzIHdpbGwgaGlnaGxpZ2h0IHRoZW0gYm90aCBpbiB0aGUgbWFwIGFuZCB0aGUgc2NhdHRlcnBsb3QsIGFuZCBrZWVwIHRoZW0gaW4gdGhlIHRhYmxlIHdoaWxlIGV4Y2x1ZGluZyBvdGhlciByb3dzLiAoVGhlIGNvbW11bml0eSBkaXN0cmljdCAjIHdpbGwgYWxzbyBiZSBkaXNwbGF5ZWQpLiBUbyByZXNldCB0aGUgc2VsZWN0aW9uLCB5b3UgY2FuIGVpdGhlciByZS1jbGljayB0aGUgaW5kaXZpZHVhbCBwb2x5Z29ucywgb3IganVzdCBkb3VibGUgY2xpY2sgaW4gdGhlIHNjYXR0ZXJwbG90LiAgWW91IGNhbiBhbHNvIGRyYXcgYSBib3ggYXJvdW5kIHBvaW50cyBpbiB0aGUgc2NhdHRlcnBsb3QsIHdoaWNoIHdpbGwgaGlnaGxpZ2h0IHRoZW0gaW4gdGhlIG1hcCwgYW5kIGtlZXAgdGhlbSBpbiB0aGUgdGFibGUuIChVbmZvcnR1bmF0ZWx5IGF0IHRoaXMgcG9pbnQsIHRoZSB0YWJsZSBpcyByZWFsbHkganVzdCBmb3Igdmlld2luZyAtIHlvdSBjYW4gb3JkZXIgZGF0YSBieSBjbGlja2luZyBvbiBjb2x1bW4gbmFtZXMsIGJ1dCB5b3UgY2FuJ3Qgc2VsZWN0IGRhdGEgaW4gdGhlIHRhYmxlIGFuZCBoYXZlIGl0IHJlZmxlY3RlZCBpbiB0aGUgc2NhdHRlcnBsb3QvbWFwLikKClRoaXMgaXMgcmVhbGx5IGZvciBleHBsb3JhdG9yeSB2aXN1YWxpemF0aW9ucywgYW5kIHRoZXJlIGFyZSBuYXR1cmFsbHkgYWRkaXRpb25hbCB0aGluZ3MgdGhhdCBjYW4gYmUgYWRkZWQgZm9yIGVhc2Ugb2YgdXNlLiBDb21wYXJlZCB0byBhIHByZXZpb3VzIHZlcnNpb24sIHRoaXMgbGV0cyB5b3Ugc2VsZWN0IHBvbHlnb25zLCBhbmQgYWxzbyB2aWV3IHRoZSBkYXRhIGluIHRoZSB0YWJsZS4gSW4gdGhlIG5lYXIgZnV0dXJlIEknbGwgd29yayB0byBkbyB0aGlzIHdpdGggb3RoZXIgbGF5ZXJzLCBmb3IgZXhhbXBsZSBsb29raW5nIGF0IGNvbWJpbmVkICUgYXJlYSBjYW5vcHkrZ3Jhc3MgYnkgY29tbXVuaXR5IGRpc3RyaWN0LCBhbmQgc29tZSBvdGhlciBzb2Npby1lY29ub21pYyB2YXJpYWJsZXMgZnJvbSB0aGUgQ29tbXVuaXR5IFByb2ZpbGVzLiBJJ2xsIGFsc28gd29yayB0byBhZGQgZnVuY3Rpb25hbGl0eSB0byB0b2dnbGUgbGF5ZXJzIG9uL29mZiwgYW5kIGNoYW5nZSB0aGUgdmFyaWFibGUgbmFtZXMgYXMgZGlzcGxheWVkLiBbcnVubmluZyB0YWxseSBvZiBkZXNpcmVkIGZ1bmN0aW9uYWxpdHkgaXMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZS5dCgoKYGBge3IsIGVjaG89RkFMU0UsIHJlc3VsdHM9RkFMU0V9CiMjIEF0IHRpbWUgb2Ygd3JpdGluZyB0aGlzIHJlbGllcyBvbiBkZXYgdmVyc2lvbiBvZiBzZiB0byBhbGxvdyBmb3IgaW1wb3J0IG9mIG5vbi1zcGF0aWFsIHRhYmxlcyBmcm9tIGZnZGIKIyMgcmVsaWVzIG9uIHJ0b29scyAzLjQgYmVpbmcgaW5zdGFsbGVkOyB0YWtlcyBhIGZldyBtaW51dGVzIG9uIHdpbmRvd3MsIGFuZCB3aW5kb3dzIG1pZ2h0IGhhdmUgaXNzdWVzIHcvIGNvbmZsaWN0aW4gUmNwcCB2ZXJzaW9ucwojZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJyLXNwYXRpYWwvc2YiKQoKIyBUaGUgaW5wdXQgZmlsZSBnZW9kYXRhYmFzZQpmZ2RiIDwtICIuLi9OWUNfMjBVcmJhbl8yMFRyZWVfMjBDYW5vcHlfMjBBc3Nlc3NtZW50XzIwTWV0cmljc18yMDIwMTAuZ2RiIgpnZXR3ZCgpCiMjIElmIG5lZWRlZCwgY2FuIGxpc3QgYWxsIGZlYXR1cmUgY2xhc3NlcyBpbiBhIGZpbGUgZ2VvZGF0YWJhc2UKI3N1YnNldChyZ2RhbDo6b2dyRHJpdmVycygpLCBncmVwbCgiR0RCIiwgbmFtZSkpCiNmY19saXN0IDwtIHJnZGFsOjpvZ3JMaXN0TGF5ZXJzKGZnZGIpCiNwcmludChmY19saXN0KQoKIyMgUmVhZCB0aGUgc3BhdGlhbCBkYXRhCmNkYm5kIDwtIHNmOjpzdF9yZWFkKGRzbj1mZ2RiLGxheWVyPSJOWUNfQ29tbXVuaXR5X0Rpc3RyaWN0c19WZXJzaW9uMTBDIikKCiNyZWFkIHRoZSB0cmVlIGxhbmQgY292ZXIgbWV0cmljcwpjZGRhdGEgPC0gc2Y6OnN0X3JlYWQoZHNuPWZnZGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXI9IkxhbmRDb3Zlcl9NZXRyaWNzX05ZQ19Db21tdW5pdHlfRGlzdHJpY3RzX1ZlcnNpb24xMEMiKQoKIyMgQWRkIHRoZSB0YWJ1bGFyIGRhdGEgdG8gdGhlIHNwYXRpYWwgb2JqZWN0CmNkLmxjIDwtIG1lcmdlKGNkYm5kLCBjZGRhdGEpCgoKIyMgTG9hZCB1cCB0aGUgY29tbXVuaXR5IGRpc3RyaWN0IHByb2ZpbGUgZGF0YQojY2Rwcm9maWxlcyA8LSByZWFkLmNzdigiaHR0cHM6Ly9wbGFubmluZ2xhYnMuY2FydG8uY29tL2FwaS92Mi9zcWw/Zm9ybWF0PWNzdiZxPVNFTEVDVCUyMGNhcnRvZGJfaWQsdGhlX2dlb20sdGhlX2dlb21fd2VibWVyY2F0b3Isc2hhcmVkX3B1bWEsZnV0dXJlX2ZwX21oaGksY3VycmVudF9mcF9taGhpLGNkX3RvdF9yZXN1bml0cyxmdXR1cmVfZnBfcmVzdW5pdHMsZnV0dXJlX2ZwX2JsZGcsY3VycmVudF9mcF9yZXN1bml0cyxjZF90b3RfYmxkZ3MsY3VycmVudF9mcF9ibGRnLG1vZV91bmRlcjE4X3JhdGVfbnljLG1vZV91bmRlcjE4X3JhdGVfYm9ybyx0b3RhbF9sb3RfYXJlYSxsb3RfYXJlYV9vdGhlcl9ub19kYXRhLGxvdF9hcmVhX3BhcmtpbmcsbG90X2FyZWFfb3Blbl9zcGFjZSxsb3RfYXJlYV9wdWJsaWNfZmFjaWxpdHlfaW5zdGl0dXRpb24sbG90X2FyZWFfdHJhbnNwb3J0YXRpb25fdXRpbGl0eSxsb3RfYXJlYV9pbmR1c3RyaWFsX21hbnVmYWN0dXJpbmcsbG90X2FyZWFfY29tbWVyY2lhbF9vZmZpY2UsbG90X2FyZWFfbWl4ZWRfdXNlLGxvdF9hcmVhX3Jlc19tdWx0aWZhbWlseV9lbGV2YXRvcixsb3RfYXJlYV9yZXNfbXVsdGlmYW1pbHlfd2Fsa3VwLGxvdF9hcmVhX3Jlc18xXzJfZmFtaWx5X2JsZGcsbG90c190b3RhbCxsb3RzX290aGVyX25vX2RhdGEsbG90c192YWNhbnQsbG90c19wYXJraW5nLGxvdHNfb3Blbl9zcGFjZSxsb3RzX3B1YmxpY19mYWNpbGl0eV9pbnN0aXR1dGlvbixsb3RzX3RyYW5zcG9ydGF0aW9uX3V0aWxpdHksbG90c19pbmR1c3RyaWFsX21hbnVmYWN0dXJpbmcsbG90c19jb21tZXJjaWFsX29mZmljZSxsb3RzX21peGVkX3VzZSxsb3RzX3Jlc19tdWx0aWZhbWlseV9lbGV2YXRvcixsb3RzX3Jlc19tdWx0aWZhbWlseV93YWxrdXAsbG90c19yZXNfMV8yX2ZhbWlseV9ibGRnLHBjdF9zZXJ2ZWRfcGFya3MsY291bnRfcHVibGljX3NjaG9vbHMsY291bnRfbGlicmFyaWVzLGNvdW50X2hvc3BfY2xpbmljLGNvdW50X3BhcmtzLGNyaW1lX2NvdW50X255YyxjcmltZV9jb3VudF9ib3JvLGNyaW1lX2NvdW50LHBjdF9jbGVhbl9zdHJ0c19ueWMscG9wXzExXzE1X2Fjcyxwb3BfMjAxMCxwb3BfMjAwMCxwdW1hLGJvcm9jZCxmdXR1cmVfZnBfcG9wLGN1cnJlbnRfZnBfcG9wLGxvdF9hcmVhX3ZhY2FudCxjYl9lbWFpbCxjYl93ZWJzaXRlLGFjc190b29sdGlwLG5laWdoYm9yaG9vZHMsc29uX2lzc3VlXzMsc29uX2lzc3VlXzIsc29uX2lzc3VlXzEsY2Rfc29uX2Z5MjAxOCxzaGFyZWRfcHVtYV9jZCxjZF9zaG9ydF90aXRsZSxjZF9mdWxsX3RpdGxlLGZ1dHVyZV9mcF9jb3N0X2J1cmRlbixjdXJyZW50X2ZwX2Nvc3RfYnVyZGVuLGZ1dHVyZV9mcF9yZW50X2J1cmRlbixjdXJyZW50X2ZwX3JlbnRfYnVyZGVuLGZ1dHVyZV9mcF9wZXJtb3J0ZyxjdXJyZW50X2ZwX3Blcm1vcnRnLGZ1dHVyZV9mcF9vd25lcm9jYyxjdXJyZW50X2ZwX293bmVyb2NjLGZ1dHVyZV9mcF9vcGVuc3BhY2UsY3VycmVudF9mcF9vcGVuc3BhY2UsZnV0dXJlX2ZwX2FyZWEsY3VycmVudF9mcF9hcmVhLHBjdF9oaXNwYW5pYyxwY3Rfb3RoZXJfbmgscGN0X2FzaWFuX25oLHBjdF9ibGFja19uaCxwY3Rfd2hpdGVfbmgsZmVtYWxlXzg1X292ZXIsbWFsZV84NV9vdmVyLGZlbWFsZV84MF84NCxtYWxlXzgwXzg0LGZlbWFsZV83NV83OSxtYWxlXzc1Xzc5LGZlbWFsZV83MF83NCxtYWxlXzcwXzc0LGZlbWFsZV82NV82OSxtYWxlXzY1XzY5LGZlbWFsZV82MF82NCxtYWxlXzYwXzY0LGZlbWFsZV81NV81OSxtYWxlXzU1XzU5LGZlbWFsZV81MF81NCxtYWxlXzUwXzU0LGZlbWFsZV80NV80OSxtYWxlXzQ1XzQ5LGZlbWFsZV80MF80NCxtYWxlXzQwXzQ0LGZlbWFsZV8zNV8zOSxtYWxlXzM1XzM5LGZlbWFsZV8zMF8zNCxtYWxlXzMwXzM0LGZlbWFsZV8yNV8yOSxtYWxlXzI1XzI5LGZlbWFsZV8yMF8yNCxtYWxlXzIwXzI0LGZlbWFsZV8xNV8xOSxtYWxlXzE1XzE5LGZlbWFsZV8xMF8xNCxtYWxlXzEwXzE0LGZlbWFsZV81XzksbWFsZV81XzksZmVtYWxlX3VuZGVyXzUsbWFsZV91bmRlcl81LG1vZV9vdmVyNjVfcmF0ZV9ueWMsb3ZlcjY1X3JhdGVfbnljLG1vZV9vdmVyNjVfcmF0ZV9ib3JvLG92ZXI2NV9yYXRlX2Jvcm8sbW9lX292ZXI2NV9yYXRlLG92ZXI2NV9yYXRlLHVuZGVyMThfcmF0ZV9ueWMsdW5kZXIxOF9yYXRlX2Jvcm8sbW9lX3VuZGVyMThfcmF0ZSx1bmRlcjE4X3JhdGUsbW9lX2xlcF9yYXRlX255YyxsZXBfcmF0ZV9ueWMsbW9lX2xlcF9yYXRlX2Jvcm8sbGVwX3JhdGVfYm9ybyxtb2VfbGVwX3JhdGUsbGVwX3JhdGUsbW9lX2ZvcmVpZ25fYm9ybixwY3RfZm9yZWlnbl9ib3JuLHBjdF9sb3RfYXJlYV9vdGhlcl9ub19kYXRhLHBjdF9sb3RfYXJlYV92YWNhbnQscGN0X2xvdF9hcmVhX3BhcmtpbmcscGN0X2xvdF9hcmVhX29wZW5fc3BhY2UscGN0X2xvdF9hcmVhX3B1YmxpY19mYWNpbGl0eV9pbnN0aXR1dGlvbixwY3RfbG90X2FyZWFfdHJhbnNwb3J0YXRpb25fdXRpbGl0eSxwY3RfbG90X2FyZWFfaW5kdXN0cmlhbF9tYW51ZmFjdHVyaW5nLHBjdF9sb3RfYXJlYV9jb21tZXJjaWFsX29mZmljZSxwY3RfbG90X2FyZWFfbWl4ZWRfdXNlLHBjdF9sb3RfYXJlYV9yZXNfbXVsdGlmYW1pbHlfZWxldmF0b3IscGN0X2xvdF9hcmVhX3Jlc19tdWx0aWZhbWlseV93YWxrdXAscGN0X2xvdF9hcmVhX3Jlc18xXzJfZmFtaWx5X2JsZGcsY3JpbWVfcGVyXzEwMDBfbnljLGNyaW1lX3Blcl8xMDAwX2Jvcm8sY3JpbWVfcGVyXzEwMDAscGN0X2NsZWFuX3N0cnRzX2Jvcm8scGN0X2NsZWFuX3N0cnRzLG1vZV9oaF9yZW50X2J1cmRfbnljLHBjdF9oaF9yZW50X2J1cmRfbnljLG1vZV9oaF9yZW50X2J1cmRfYm9ybyxwY3RfaGhfcmVudF9idXJkX2Jvcm8sbW9lX2hoX3JlbnRfYnVyZCxwY3RfaGhfcmVudF9idXJkLG1vZV9tZWFuX2NvbW11dGVfbnljLG1lYW5fY29tbXV0ZV9ueWMsbW9lX21lYW5fY29tbXV0ZV9ib3JvLG1lYW5fY29tbXV0ZV9ib3JvLG1vZV9tZWFuX2NvbW11dGUsbWVhbl9jb21tdXRlLG1vZV91bmVtbnBsb3ltZW50LHVuZW1wbG95bWVudF9ueWMsbW9lX3VuZW1wbG95bWVudF9ib3JvLHVuZW1wbG95bWVudF9ib3JvLG1vZV91bmVtcGxveW1lbnRfY2QsdW5lbXBsb3ltZW50X2NkLG1vZV9iYWNoX2RlZ19ueWMscGN0X2JhY2hfZGVnX255Yyxtb2VfYmFjaF9kZWdfYm9ybyxwY3RfYmFjaF9kZWdfYm9ybyxtb2VfYmFjaF9kZWcscGN0X2JhY2hfZGVnLHBvdmVydHlfcmF0ZV9ueWMscG92ZXJ0eV9yYXRlX2Jvcm8sbW9lX3BvdmVydHlfcmF0ZSxwb3ZlcnR5X3JhdGUscG9wX2NoYW5nZV8wMF8xMCxhcmVhX3NxbWksYWNyZXMlMjBGUk9NJTIwY29tbXVuaXR5X2Rpc3RyaWN0X3Byb2ZpbGVzJmZpbGVuYW1lPVF1ZWVucy03LWluZGljYXRvcnMuY3N2IikKCgpjZHByb2ZpbGVzIDwtIHJlYWQuY3N2KCJodHRwczovL3BsYW5uaW5nbGFicy5jYXJ0by5jb20vYXBpL3YyL3NxbD9mb3JtYXQ9Y3N2JnE9U0VMRUNUJTIwY2FydG9kYl9pZCxib3JvY2QscGN0X2hoX3JlbnRfYnVyZCUyMEZST00lMjBjb21tdW5pdHlfZGlzdHJpY3RfcHJvZmlsZXMiKQojIyBGb3Igc29tZSBlYXNpZXIgdW5kZXJzdGFuZGluZyBvZiB0aGUgZGF0YSwgZGF0YSBkaWN0aW9uYXJ5OgpjZHByb2ZpbGUuZGF0YWRpYyA8LSByZWFkLmNzdigiaHR0cHM6Ly9jb21tdW5pdHlwcm9maWxlcy5wbGFubmluZy5ueWMuZ292L2RhdGEvY2RfcHJvZmlsZV9kYXRhX2RpY3Rpb25hcnkuY3N2IikKCiMjIE1lcmdlIHdpdGggbGFuZCBjb3ZlciBkYXRhCmNkLmxjLmNwIDwtIG1lcmdlKGNkLmxjLCBjZHByb2ZpbGVzLCBieS54PSJCb3JvQ0QiLCBieS55PSJib3JvY2QiKQoKY2QubGMuY3AkQ2FuX1AgPC0gcm91bmQoY2QubGMuY3AkQ2FuX1AsIDApCmNkLmxjLmNwJHBjdF9oaF9yZW50X2J1cmQgPC0gcm91bmQoY2QubGMuY3AkcGN0X2hoX3JlbnRfYnVyZCwgMCkKCgojaW5zdGFsbC5wYWNrYWdlcyhjKCJwbG90bHkiLCAiRFQiKSkKY2QubGMuY3AyIDwtIGNkLmxjLmNwWyxjKCJCb3JvQ0QiLCAiQ2FuX1AiLCAicGN0X2hoX3JlbnRfYnVyZCIpXQpvYmplY3Quc2l6ZShjZC5sYy5jcDIpCgpsaWJyYXJ5KHNmKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShsZWFmbGV0KQpsaWJyYXJ5KGNyb3NzdGFsaykKbGlicmFyeShodG1sdG9vbHMpCgpjZC5sYy5jcDIgPC0gc3RfdHJhbnNmb3JtKGNkLmxjLmNwMiwgY3JzPTQzMjYpCiAgCmNkX3NkIDwtIFNoYXJlZERhdGEkbmV3KAogIGNkLmxjLmNwMiwKICBrZXk9fkJvcm9DRCwKICAjIHByb3ZpZGUgZXhwbGljaXQgZ3JvdXAgc28gd2UgY2FuIGVhc2lseSByZWZlciB0byB0aGlzIGxhdGVyCiAgZ3JvdXAgPSAiQm9yb0NEIgopCgoKCm1hcCA8LSBsZWFmbGV0KGNkX3NkKSAlPiUKICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRDYXJ0b0RCLlBvc2l0cm9uKSAlPiUKICBhZGRUaWxlcyh1cmxUZW1wbGF0ZSA9ICJodHRwczovL21hcHMubnljLmdvdi90bXMvMS4wLjAvcGhvdG8vMjAxNi97en0ve3h9L3t5fS5wbmc4IiwKICAgICAgICAgICBhdHRyaWJ1dGlvbiA9ICdJbWFnZXJ5IGZyb20gdGhlIDxhIGhyZWY9Imh0dHBzOi8vbWFwcy5ueWMuZ292L3RpbGVzLyI+Q2l0eSBvZiBOZXcgWW9yazwvYT4nLAogICAgICAgICAgIG9wdGlvbnMgPSB0aWxlT3B0aW9ucyhtaW5OYXRpdmVab29tPSA4LCBtYXhOYXRpdmVab29tPSAxOSwgc3ViZG9tYWlucz0gJzEyMzQnLCB0bXM9VFJVRSkpICU+JSAgICAjYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkQ2FydG9EQi5Qb3NpdHJvbikgJT4lCiAgYWRkUG9seWdvbnMoCiAgICBkYXRhPWNkLmxjLmNwMiwKICAgIGxheWVySWQgPSB+Qm9yb0NELAogICAgY29sb3IgPSAiIzQ0NDQ0NCIsCiAgICB3ZWlnaHQgPSAxLAogICAgc21vb3RoRmFjdG9yID0gMC41LAogICAgb3BhY2l0eSA9IDEuMCwKICAgIGZpbGxPcGFjaXR5ID0gMC41LAogICAgZmlsbENvbG9yID0gfmNvbG9yUXVhbnRpbGUoIkdyZWVucyIsIENhbl9QKShDYW5fUCksCiAgICBwb3B1cD1+YXMuY2hhcmFjdGVyKHBhc3RlKCJDb21tdW5pdHkgRGlzdHJpY3QiLCBCb3JvQ0QpKSwjLAojICB0dXJuIG9mZiBoaWdobGlnaHQgc2luY2UgaXQgaW50ZXJmZXJlcyB3aXRoIHNlbGVjdGlvbiBzdHlsaW5nCiMgICBpZiBjYXJlZnVsIHdpdGggc3R5bGluZyBjb3VsZCBoYXZlIGJvdGggaGlnaGxpZ2h0IGFuZCBzZWxlY3QKIyAgICBoaWdobGlnaHRPcHRpb25zID0gaGlnaGxpZ2h0T3B0aW9ucyhjb2xvciA9ICJ3aGl0ZSIsIHdlaWdodCA9IDIpCiAgKQoKIyBib3Jyb3cgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vci1zcGF0aWFsL21hcGVkaXQvYmxvYi9tYXN0ZXIvUi9xdWVyeS5SI0w3My1MMTMyCiMgICB0byBzZWxlY3QvZGVzZWxlY3QgZmVhdHVyZXMgYnV0IGluc3RlYWQgb2YgU2hpbnkub25JbnB1dENoYW5nZQojICAgdXNlIGNyb3NzdGFsayB0byBtYW5hZ2Ugc3RhdGUKYWRkX3NlbGVjdF9zY3JpcHQgPC0gZnVuY3Rpb24obGYsIHN0eWxlRmFsc2UsIHN0eWxlVHJ1ZSwgbnM9IiIpIHsKICAjIyBjaGVjayBmb3IgZXhpc3Rpbmcgb25SZW5kZXIganNIb29rPwoKICBodG1sd2lkZ2V0czo6b25SZW5kZXIoCiAgICBsZiwKICAgIHNwcmludGYoCiIKZnVuY3Rpb24oZWwseCkgewogIHZhciBsZiA9IHRoaXM7CiAgdmFyIHN0eWxlX29iaiA9IHsKICAgICdmYWxzZSc6ICVzLAogICAgJ3RydWUnOiAlcwogIH0KCiAgLy8gaW5zdGVhZCBvZiBzaGlueSBpbnB1dCBhcyBvdXIgc3RhdGUgbWFuYWdlcgogIC8vICAgdXNlIGNyb3NzdGFsawogIGlmKGNyb3NzdGFsaykgewogICAgdmFyIGN0X3NlbCA9IG5ldyBjcm9zc3RhbGsuU2VsZWN0aW9uSGFuZGxlKCkKICAgIGN0X3NlbC5zZXRHcm91cCgnQm9yb0NEJykKICAgIGN0X3NlbC5vbignY2hhbmdlJywgZnVuY3Rpb24oeCl7CiAgICAgIGlmKHguc2VuZGVyICE9PSBjdF9zZWwpIHsgLy9pZ25vcmUgc2VsZWN0IGZyb20gdGhpcyBtYXAKICAgICAgICBsZi5lYWNoTGF5ZXIoZnVuY3Rpb24obHlyKXsKICAgICAgICAgIGlmKGx5ci5vcHRpb25zICYmIGx5ci5vcHRpb25zLmxheWVySWQpIHsKICAgICAgICAgICAgdmFyIGlkID0gU3RyaW5nKGx5ci5vcHRpb25zLmxheWVySWQpCiAgICAgICAgICAgIGlmKAogICAgICAgICAgICAgICF4LnZhbHVlICB8fAogICAgICAgICAgICAgIChBcnJheS5pc0FycmF5KHgudmFsdWUpICYmIHgudmFsdWUuaW5kZXhPZihpZCkgPT09IC0xKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICB0b2dnbGVfc3RhdGUobHlyLCBmYWxzZSkKICAgICAgICAgICAgICB0b2dnbGVfc3R5bGUobHlyLCBzdHlsZV9vYmouZmFsc2UpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheSh4LnZhbHVlKSAmJiB4LnZhbHVlLmluZGV4T2YoaWQpID4gLTEpIHsKICAgICAgICAgICAgICB0b2dnbGVfc3RhdGUobHlyLCB0cnVlKQogICAgICAgICAgICAgIHRvZ2dsZV9zdHlsZShseXIsIHN0eWxlX29iai50cnVlKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgfQogICAgfSkKICB9CgogIC8vIGRlZmluZSBvdXIgZnVuY3Rpb25zIGZvciB0b2dnbGluZwogIGZ1bmN0aW9uIHRvZ2dsZV9zdHlsZShsYXllciwgc3R5bGVfb2JqKSB7CiAgICBsYXllci5zZXRTdHlsZShzdHlsZV9vYmopOwogIH07CiAgZnVuY3Rpb24gdG9nZ2xlX3N0YXRlKGxheWVyLCBzZWxlY3RlZCwgaW5pdCkgewogICAgaWYodHlwZW9mKHNlbGVjdGVkKSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgbGF5ZXIuX21hcGVkaXRfc2VsZWN0ZWQgPSBzZWxlY3RlZDsKICAgIH0gZWxzZSB7CiAgICAgIHNlbGVjdGVkID0gIWxheWVyLl9tYXBlZGl0X3NlbGVjdGVkOwogICAgICBsYXllci5fbWFwZWRpdF9zZWxlY3RlZCA9IHNlbGVjdGVkOwogICAgfQogICAgaWYodHlwZW9mKFNoaW55KSAhPT0gJ3VuZGVmaW5lZCcgJiYgU2hpbnkub25JbnB1dENoYW5nZSAmJiAhaW5pdCkgewogICAgICBTaGlueS5vbklucHV0Q2hhbmdlKAogICAgICAgICclcy1tYXBlZGl0X3NlbGVjdGVkJywKICAgICAgICB7CiAgICAgICAgICAnZ3JvdXAnOiBsYXllci5vcHRpb25zLmdyb3VwLAogICAgICAgICAgJ2lkJzogbGF5ZXIub3B0aW9ucy5sYXllcklkLAogICAgICAgICAgJ3NlbGVjdGVkJzogc2VsZWN0ZWQKICAgICAgICB9CiAgICAgICkKICAgIH0KCiAgICBpZihjdF9zZWwpIHsKICAgICAgdmFyIGN0X3ZhbHVlcyA9IGN0X3NlbC52YWx1ZQogICAgICB2YXIgaWQgPSBTdHJpbmcobGF5ZXIub3B0aW9ucy5sYXllcklkKQogICAgICBpZihzZWxlY3RlZCkgewogICAgICAgIGlmKCFjdF92YWx1ZXMpIHsKICAgICAgICAgIGN0X3NlbC5zZXQoW2lkXSkKICAgICAgICB9CiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShjdF92YWx1ZXMpICYmIGN0X3ZhbHVlcy5pbmRleE9mKGlkKSA9PT0gLTEpIHsKICAgICAgICAgIGN0X3NlbC5zZXQoY3RfdmFsdWVzLmNvbmNhdChpZCkpCiAgICAgICAgfQogICAgICB9CgogICAgICBpZihjdF92YWx1ZXMgJiYgIXNlbGVjdGVkKSB7CiAgICAgICAgY3RfdmFsdWVzLmxlbmd0aCA+IDEgPwogICAgICAgICAgY3Rfc2VsLnNldCgKICAgICAgICAgICAgY3RfdmFsdWVzLmZpbHRlcihmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGQgIT09IGlkCiAgICAgICAgICAgIH0pCiAgICAgICAgICApIDoKICAgICAgICAgIGN0X3NlbC5zZXQobnVsbCkgLy8gc2VsZWN0IGFsbCBpZiBub3RoaW5nIHNlbGVjdGVkCiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gc2VsZWN0ZWQ7CiAgfTsKICAvLyBzZXQgdXAgY2xpY2sgaGFuZGxlciBvbiBlYWNoIGxheWVyIHdpdGggYSBncm91cCBuYW1lCiAgbGYuZWFjaExheWVyKGZ1bmN0aW9uKGx5cil7CiAgICBpZihseXIub24gJiYgbHlyLm9wdGlvbnMgJiYgbHlyLm9wdGlvbnMubGF5ZXJJZCkgewogICAgICAvLyBzdGFydCB3aXRoIGFsbCB1bnNlbGVjdGVkID8KICAgICAgdG9nZ2xlX3N0YXRlKGx5ciwgZmFsc2UsIGluaXQ9dHJ1ZSk7CiAgICAgIHRvZ2dsZV9zdHlsZShseXIsIHN0eWxlX29ialtseXIuX21hcGVkaXRfc2VsZWN0ZWRdKTsKICAgICAgbHlyLm9uKCdjbGljaycsZnVuY3Rpb24oZSl7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gdG9nZ2xlX3N0YXRlKGUudGFyZ2V0KTsKICAgICAgICB0b2dnbGVfc3R5bGUoZS50YXJnZXQsIHN0eWxlX29ialtTdHJpbmcoc2VsZWN0ZWQpXSk7CiAgICAgIH0pOwogICAgfQogIH0pOwp9CiIsCiAgICAgIGpzb25saXRlOjp0b0pTT04oc3R5bGVGYWxzZSwgYXV0b191bmJveD1UUlVFKSwKICAgICAganNvbmxpdGU6OnRvSlNPTihzdHlsZVRydWUsIGF1dG9fdW5ib3g9VFJVRSksCiAgICAgIG5zCiAgICApCiAgKQp9CgoKbGlicmFyeShEVCkKZHQgPC0gZGF0YXRhYmxlKGNkX3NkLCB3aWR0aD0iMTAwJSIpCmR0JHgkZGF0YSA8LSBkcGx5cjo6c2VsZWN0KGR0JHgkZGF0YSwgLWdlb21ldHJ5KQojZHQkeCRkYXRhIDwtIGRwbHlyOjpzZWxlY3QoZHQkeCRkYXRhLCBCb3JvQ0QsIENhbl9QLCBwY3RfaGhfcmVudF9idXJkKQpkdCR4JG9wdGlvbnMkY29sdW1uRGVmc1tbMV1dJHRhcmdldHMgPC0gc2VxX2xlbihuY29sKGNkLmxjLmNwMiktMSkKI2R0JHgkb3B0aW9ucyRjb2x1bW5EZWZzW1sxXV0kdGFyZ2V0cyA8LSAod2hpY2gobmFtZXMoZHQkeCRkYXRhPT1jKCJCb3JvQ0QiLCAiQ2FuX1AiLCAicGN0X2hoX3JlbnRfYnVyZCIpKSkpCiNzZXFfbGVuKG5jb2woZHQkeCRkYXRhKSkKCgojKGR0JHgkb3B0aW9ucyRjb2x1bW5EZWZzW1sxXV0kdGFyZ2V0cyk9PSJCb3JvQ0QiCgphdHRyKGR0JHgsICJjb2xuYW1lcyIpIDwtIGF0dHIoZHQkeCwgImNvbG5hbWVzIikjW3doaWNoKGF0dHIoZHQkeCwgImNvbG5hbWVzIikgIT0gImdlb21ldHJ5IildCmR0JHgkY29udGFpbmVyIDwtIGdzdWIoeD1kdCR4JGNvbnRhaW5lciwgcGF0dGVybj0iPHRoPmdlb21ldHJ5PC90aD5cbiIsIHJlcGxhY2VtZW50PSIiKQojZHQKCiMgbm93IHRyeSBsZWFmbGV0LCBwbG90bHksIGFuZCBkdAojICAgdGhpcyB1bmZvcnR1bmF0ZWx5IGRvZXMgbm90IHdvcmsKIyAgIGV4YWN0bHkgYXMgd2Ugd291bGQgbGlrZSBidXQgcGxvdGx5IHVzZSBvZiBTdHJpbmcga2V5CiMgICBzZWVtcyB0byBjYXVzZSB0aGUgcHJvYmxlbQojICAgZml4aW5nIFBsb3RseSBpcyBvdXQgb2Ygc2NvcGUgb2YgdGhpcyBwcm9qZWN0CiMgICBidXQgSSBtaWdodCB0YWtlIGEgbG9vayBhdCBzb21lIHBvaW50IHRvIHN1Ym1pdCBwdWxsCmJyb3dzYWJsZSgKICB0YWdMaXN0KAogICAgdGFncyRkaXYoCiAgICAgIHN0eWxlID0gImZsb2F0OmxlZnQ7IHdpZHRoOiA0OSU7IiwKICAgICAgYWRkX3NlbGVjdF9zY3JpcHQoCiAgICAgICAgbWFwLAogICAgICAgIHN0eWxlRmFsc2UgPSBsaXN0KGZpbGxPcGFjaXR5ID0gMC42LCB3ZWlnaHQgPSAxLCBvcGFjaXR5ID0gMC40LCBjb2xvcj0iYmxhY2siKSwKICAgICAgICBzdHlsZVRydWUgPSBsaXN0KGZpbGxPcGFjaXR5ID0gMC43LCB3ZWlnaHQgPSAzLCBvcGFjaXR5ID0gMC43LCBjb2xvcj0iYmx1ZSIpLAogICAgICAgIG5zID0gIiIKICAgICAgKQogICAgKSwKICAgIHRhZ3MkZGl2KAogICAgICBzdHlsZSA9ICJmbG9hdDpsZWZ0OyB3aWR0aDogNDklOyIsCiAgICAgIHBsb3RfbHkoY2Rfc2QsIHggPSB+Q2FuX1AsIHkgPSB+cGN0X2hoX3JlbnRfYnVyZCkgJT4lCiAgICAgICAgYWRkX21hcmtlcnMoYWxwaGEgPSAwLjUsdGV4dCA9IH5wYXN0ZSgnQ29tbXVuaXR5IERpc3RyaWN0OiAnLCBCb3JvQ0QpKSAlPiUKICAgICAgICBoaWdobGlnaHQob24gPSAicGxvdGx5X3NlbGVjdGVkIikKICAgICksCiAgICB0YWdzJGRpdigKICAgICAgc3R5bGUgPSAiZmxvYXQ6bGVmdDsgd2lkdGg6IDk4JTsiLAogICAgICBkdAogICAgKQogICkKKQoKYGBgCjxiciAvPiAKPGJyIC8+CgoKCkRlc2lyZWQgRnVuY3Rpb25hbGl0eToKCiogQWRkIGJhY2sgdG9nZ2xpbmcgb2YgYmFzZW1hcHM7CiogQWRkIG90aGVyIGxheWVycyB0byBtYXAgKGUuZy4sIHRvdGFsIGFyZWEgb2YgZXN0aW1hdGVkIHBlcm1lYWJsZSBvciB0cmVlIGNhbm9weTsgb3RoZXIgc29jaW8tZWNvbWljL2hlYWx0aCB2YXJpYWJsZXMpOwoqIENoYW5nZSB2YXJpYWJsZSBuYW1lcyBpbiBkaXNwbGF5IChlLmcuLCAlIG9mIEhvdXNlaG9sZHMgdGhhdCBhcmUgUmVudCBCdXJkZW5lZCk7CiogQWRkIGFub3RoZXIgdmFyaWFibGUgb3IgdHdvIGFuZCBtYWtlIGl0IHNvIHlvdSBjYW4gdG9nZ2xlIGJldHdlZW4gdGhlbTsKKiBNYWtlIGl0IHNvIHlvdSBjYW4gc2VsZWN0IGluIHRoZSAgdGFibGUgYW5kIGhhdmUgdGhhdCByZWZsZWN0ZWQgaW4gdGhlIG1hcCBhbmQgc2NhdHRlcnBsb3Q7CiogSGlzdG9ncmFtcyB0aGF0IGhpZ2hsaWdodA==